
#include "ControladorEscrituraCliente.h"

ControladorEscrituraCliente::ControladorEscrituraCliente(Punto posicionJugador) {
	
	pthread_mutex_init(&mutexEstadoEscritura, NULL);
	pthread_mutex_init(&mutexDibujables, NULL);
	pthread_mutex_init(&mutexSonidos, NULL);
	pthread_mutex_init(&mutexPuntajes, NULL);
	pthread_mutex_init(&mutexUpdates, NULL);
	
	this->posicionJugador = posicionJugador;
	
	dibujables = "<>";
	sonidos = "<>";
	puntajes = "<>";
	setEstadoEscritura(EscrituraCorriendo);
}

ControladorEscrituraCliente::~ControladorEscrituraCliente() {
	
	pthread_mutex_destroy(&mutexEstadoEscritura);
	pthread_mutex_destroy(&mutexDibujables);
	pthread_mutex_destroy(&mutexSonidos);
	pthread_mutex_destroy(&mutexPuntajes);
	pthread_mutex_destroy(&mutexUpdates);
}

EstadoThreadEscritura ControladorEscrituraCliente::getEstadoEscritura() {

	pthread_mutex_lock(&mutexEstadoEscritura);
	EstadoThreadEscritura e = threadEscritura.second;
	pthread_mutex_unlock(&mutexEstadoEscritura);
	
	return e;
}

void ControladorEscrituraCliente::setEstadoEscritura(EstadoThreadEscritura estado) {

	pthread_mutex_lock(&mutexEstadoEscritura);
	threadEscritura.second = estado;
	pthread_mutex_unlock(&mutexEstadoEscritura);
}

void ControladorEscrituraCliente::setDibujables(string paquete) {
	
	pthread_mutex_lock(&mutexDibujables);
	dibujables = paquete;
	pthread_mutex_unlock(&mutexDibujables);
}

void ControladorEscrituraCliente::addUpdate(string mensaje) {
	
	pthread_mutex_lock(&mutexUpdates);
	updates.push(mensaje);
	pthread_mutex_unlock(&mutexUpdates);
}

vector<string> ControladorEscrituraCliente::getUpdates() {
	
	vector<string> updatesAProcesar;
	pthread_mutex_lock(&mutexUpdates);
	while (!updates.empty()) {
		updatesAProcesar.push_back(updates.front());
		updates.pop();
	}
	pthread_mutex_unlock(&mutexUpdates);
	
	return updatesAProcesar;
}

void ControladorEscrituraCliente::setPosicionJugador(Punto posicion) {
	
	posicionJugador = posicion;
}

string ControladorEscrituraCliente::getDibujables() {
	
	pthread_mutex_lock(&mutexDibujables);
	string mensaje = dibujables;
	string posicion = Logger::intToString(posicionJugador.getX()) + ";" + Logger::intToString(posicionJugador.getY());
	pthread_mutex_unlock(&mutexDibujables);
	
	return posicion+mensaje;
	
}

string ControladorEscrituraCliente::getPuntajes() {
	
	pthread_mutex_lock(&mutexPuntajes);
	string mensaje = puntajes;
	pthread_mutex_unlock(&mutexPuntajes);
	
	return mensaje;
}

void ControladorEscrituraCliente::setPuntajes(string puntajes) {

	pthread_mutex_lock(&mutexPuntajes);
	this->puntajes = puntajes;
	pthread_mutex_unlock(&mutexPuntajes);
}

string ControladorEscrituraCliente::getSonidos() {
	
	pthread_mutex_lock(&mutexSonidos);
	string mensaje = sonidos;
	pthread_mutex_unlock(&mutexSonidos);
	
	return mensaje;
}

void ControladorEscrituraCliente::setSonidos(string sonidos) {

	pthread_mutex_lock(&mutexSonidos);
	this->sonidos = sonidos;
	pthread_mutex_unlock(&mutexSonidos);
}